#include "angle_sensor.h"

void angle_sensor_init(void)
{
	HAL_ADC_Start(&hadc1);
		/* 1. 校准 & 启动ADC+DMA */
	HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcBuf, ADC_BUF_LEN);
}

static float iir_filter(float in, float *mem, float alpha)
{
    /* α越小越平滑，建议 0.1 ~ 0.2 */
    float out = in * alpha + (*mem) * (1.0f - alpha);
    *mem = out;
    return out;
}

/* 在 HAL_ADC_ConvCpltCallback 中完成所有计算 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if (hadc->Instance != ADC1) return;

    /* 1. 求平均 */
    uint32_t sum = 0;
    for (uint32_t i = 0; i < ADC_BUF_LEN; i++)
        sum += adcBuf[i];
    float avgRaw = (float)sum / ADC_BUF_LEN;

    /* 2. 原始电压 */
    float voltage = (avgRaw / 4095.0f) * VDDA;

    /* 3. 线性角度 */
    float angle_raw = voltage * VOLTAGE_TO_ANGLE_SLOPE;

    /* 4. 角度归一化到 0~360° */
    if (angle_raw >= 360.0f) angle_raw -= 360.0f;
    if (angle_raw <   0.0f) angle_raw += 360.0f;

    /* 5. IIR 平滑 */
    static float angle_mem = 0.0f;
    angle_f = iir_filter(angle_raw, &angle_mem, 0.15f);
		bool at_end_stop = (angle_f >= (ELEC_END - DEAD_BAND));
    /* 6. 标记完成 */
    adcConvDone = true;
}
